package com.rabbitmq.service;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.UUID;

@Service
public class ReceiveService {
    @Resource
    private AmqpTemplate amqpTemplate;

    public void directReceive() {
        //监听队列并接收消息,它不能持续性接收消息
        String message = (String) amqpTemplate.receiveAndConvert("directBootQueue");
        System.out.println(message);
    }

    /**
     * @RabbitListener 用于标记当前方法是RabbitMQ的消息监听方法,用于持续性接收消息
     *  属性
     *    queues 用于指定需要监听的1个或多个队列名称取值为String数组类型,
     *           这个属性只能设置监听队列不能声明队列因此被监听的队列必须要先声明并绑定到交换机
     * 注意:
     *   1.使用监听器接收消息后就不能再调用普通接收消息的方法了
     *   2.消息监听自带消费者确认模式,当前方法如果正常结束消息会从队列中移除,如果当前方法
     *     因异常结束则会将消息放回到队列的尾部再次尝试获取
     */
    @RabbitListener(queues={"directBootQueue"})
    public void directListener(String message) {
        System.out.println(message);
//        System.out.println(10/0);
    }
    /**
     * @RabbitListener 用于标记当前方法是RabbitMQ的消息监听方法,用于持续性接收消息
     *  属性
     *    bindings 将队列和交换机进行绑定 取值为 @QueueBinding数组类型
     *      @QueueBinding 将某个队列和某个交换机进行绑定
     *        属性
     *          value 用于执行需要绑定的队列 取值为@Queue
     *            @Queue 用于声明一个队列并使用这个队列
     *              属性
     *                value和name 用于指定队列的名称,可以选如果不填写则创建一个随机的队列
     *                durable 是否持久化的 取值为String类型的"true"和"false"
     *                exclusive 是否排外的的 取值为String类型的"true"和"false"
     *                autoDelete 是否自动删除的 取值为String类型的"true"和"false"
     *          exchange 用于指定需要绑定的交换机 取值为@Exchange
     *             @Exchange
     *               属性
     *                 value和name 用于指定交换机的名称
     *                 type 指定交换机类型 取值为String类型的 direct fanout topic headers 默认值为 direct
     *                 durable 是否持久化的 取值为String类型的"true"和"false"
     *                 autoDelete 是否自动删除的 取值为String类型的"true"和"false"
     *          key 指定绑定时的BindingKey 取值为String数组
     */
//    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "fanoutBootExchange",type = "fanout"))})
//    public void fanoutListener01(String message) {
//        System.out.println("fanoutListener01: "+message);;
//    }
//    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "fanoutBootExchange",type = "fanout"))})
//    public void fanoutListener02(String message) {
//        System.out.println("fanoutListener02: "+message);;
//    }
//    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "fanoutBootExchange",type = "fanout"))})
//    public void fanoutListener03(String message) {
//        System.out.println("fanoutListener03: "+message);;
//    }

    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "topicBootExchange",type = "topic"),key="aa")})
    public void topicListener01(String message) {
        System.out.println("topicListener01: BindingKey:aa  \t"+message);
    }
    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "topicBootExchange",type = "topic"),key="aa.*")})
    public void topicListener02(String message) {
        System.out.println("topicListener02: BindingKey:aa.*\t"+message);
    }
    @RabbitListener(bindings={@QueueBinding(value = @Queue(),exchange = @Exchange(name = "topicBootExchange",type = "topic"),key="aa.#")})
    public void topicListener03(String message) {
        System.out.println("topicListener03: BindingKey:aa.#\t"+message);
    }
//    lecz期间再回来摸摸rabbitmq
//    @RabbitListener(queues = "qq3")
//    public void topicListener043(String message) {
//        System.out.println("topicListener22222: BindingKey:aa.#\t"+message);
//    }
//
//    @RabbitListener(queues = "qq4")
//    public void topicListener0433(String message) {
//        System.out.println("topicListener011111: BindingKey:aa.#\t"+message);
//    }
}
